/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOVentaFacturacion;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.Ubigeo;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;

/**
 *
 * @author Jorge
 */
@SuppressWarnings({"unchecked", "serial", "rawtypes", "deprecation"})
@Repository("daoVentaFacturacion")
public class DAOVentaFacturacionImpl extends DaoImpl<VentaFacturacion, Integer> implements IDAOVentaFacturacion, Serializable {

    @Override
    public int obtenerIdMonedaFacturacion(Integer idVentaFacturacion) throws DAOException {

        try {
            Integer moneda = (Integer) sessionFactory.getCurrentSession().createSQLQuery("SELECT moneda FROM cotelasa.venta_facturacion WHERE coddocventa=:id").addScalar("moneda", Hibernate.INTEGER).setParameter("id", idVentaFacturacion).uniqueResult();
            return moneda.intValue();
        } catch (Exception e) {
        }
        return 0;
    }

    @Override
    public int obtenerIdFormaPagoFacturacion(Integer idVentaFacturacion) throws DAOException {
        try {
            Integer moneda = (Integer) sessionFactory.getCurrentSession().createSQLQuery("SELECT forma_pago FROM cotelasa.venta_facturacion WHERE coddocventa=:id").addScalar("forma_pago", Hibernate.INTEGER).setParameter("id", idVentaFacturacion).uniqueResult();
            return moneda.intValue();
        } catch (Exception e) {
        }
        return 0;
    }

    @Override
    public int obtenerIdMotivoTrasladoFacturacion(Integer idVentaFacturacion) throws DAOException {
        try {
            Integer moneda = (Integer) sessionFactory.getCurrentSession().createSQLQuery("SELECT mot_traslado FROM cotelasa.venta_facturacion WHERE coddocventa=:id").addScalar("mot_traslado", Hibernate.INTEGER).setParameter("id", idVentaFacturacion).uniqueResult();
            return moneda.intValue();
        } catch (Exception e) {
        }
        return 0;
    }

    @Override
    public void eliminarDetalleFactura(Integer idVentaFacturacion) throws DAOException {
        try {
            sessionFactory.getCurrentSession().createSQLQuery("DELETE FROM cotelasa.venta_detalle_facturacion WHERE coddocventa=:id").setParameter("id", idVentaFacturacion).executeUpdate();
        } catch (Exception e) {
        }
    }

    @Override
    public List<VentaFacturacion> listarFacturacionTipo(Integer tipo) throws DAOException {
        List<VentaFacturacion> listaFacturacion = new ArrayList<VentaFacturacion>();
        try {
            listaFacturacion = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class)
                    .add(Restrictions.eq("tipoCompago", tipo)).list();
        } catch (Exception e) {
        }
        return listaFacturacion;
    }

    @Override
    public int obtenerIdTipoDocumento(Integer idVentaFacturacion) throws DAOException {
        try {
            Integer moneda = (Integer) sessionFactory.getCurrentSession().createSQLQuery("SELECT tipo_documento FROM cotelasa.venta_facturacion WHERE coddocventa=:id").addScalar("tipo_documento", Hibernate.INTEGER).setParameter("id", idVentaFacturacion).uniqueResult();
            return moneda.intValue();
        } catch (Exception e) {
        }
        return 0;
    }

    @Override
    public List<VentaFacturacion> listarFacturacionPendientes(Integer tipo, Integer formapago, Integer idCliente, Character estado, Integer idSede) throws DAOException {


        List<VentaFacturacion> listaFacturacion = new ArrayList<VentaFacturacion>();
        try {
            System.out.println("tipo: " + tipo);
            System.out.println("formapago: " + formapago);
            System.out.println("idCliente: " + idCliente);
            System.out.println("idSede: " + idSede);
            listaFacturacion = sessionFactory.getCurrentSession().createSQLQuery("SELECT * FROM cotelasa.venta_facturacion "
                    + "WHERE tipo_compago=:tipo AND forma_pago=:pago AND cod_cliente=:cliente AND estado in ('E','F') AND id_sede=:local "
                    + "ORDER BY  fech_docventa ASC ")
                    .addEntity(VentaFacturacion.class)
                    .setParameter("tipo", tipo.intValue())
                    .setParameter("pago", formapago.intValue())
                    .setParameter("cliente", idCliente.intValue())
                    .setParameter("local", idSede.intValue())
                    .list();

        } catch (Exception e) {
        }
        return listaFacturacion;
    }

    @Override
    public List<VentaFacturacion> obtenerFacturasRV(String inicio, String fin, Integer idSede) throws DAOException {
        List<VentaFacturacion> listaFacturacion = new ArrayList<VentaFacturacion>();
        try {
            System.out.println("SELECT * FROM cotelasa.venta_facturacion "
                    + "WHERE fech_docventa>='" + inicio + "' AND fech_docventa<='" + fin + "' AND tipo_compago IN (10,20) AND id_sede=" + idSede
                    + " ORDER BY fech_docventa ASC");
            listaFacturacion = sessionFactory.getCurrentSession().createSQLQuery("SELECT * FROM cotelasa.venta_facturacion "
                    + "WHERE fech_docventa>='" + inicio + "' AND fech_docventa<='" + fin + "' AND tipo_compago IN (10,20) AND id_sede=" + idSede
                    + " ORDER BY fech_docventa ASC")
                    .addEntity(VentaFacturacion.class)
                    .list();
            System.out.println("lista: " + listaFacturacion);
        } catch (Exception e) {
        }
        return listaFacturacion;

    }

    @Override
    public List<VentaFacturacion> obtenerVentaFacturacionBusqueda(VentaFacturacion ventaFacturacion, Date fechaInicio, Date fechaFinal) throws DAOException {
        List<VentaFacturacion> lista = new ArrayList<VentaFacturacion>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class)
                    .addOrder(Order.desc("id"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("tipoCompago", ventaFacturacion.getTipoCompago()))
                    .add(Restrictions.like("ruc", "%" + ventaFacturacion.getRuc() + "%"))
                    .add(Restrictions.like("razon", "%" + ventaFacturacion.getRazon() + "%"))
                    .add(Restrictions.like("numFactura", "%" + ventaFacturacion.getNumFactura() + "%"));

            if (ventaFacturacion.getSede() != null) {
                query = query.add(Restrictions.eq("sede", ventaFacturacion.getSede()));

            }

            if (ventaFacturacion.getFormaPago() != null) {
                if (ventaFacturacion.getFormaPago().getId() != 0) {
                    query = query.createAlias("formaPago", "f")
                            .add(Restrictions.eq("f.id", ventaFacturacion.getFormaPago().getId()));
                }
            }


            if (fechaInicio == null && fechaFinal == null) {
                lista = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                lista = query.add(Restrictions.ge("fechDocventa", fechaInicio)).add(Restrictions.le("fechDocventa", fechaFinal)).list();
            } else if (fechaInicio == null) {
                lista = query.add(Restrictions.le("fechDocventa", fechaFinal)).list();
            } else if (fechaFinal == null) {
                lista = query.add(Restrictions.ge("fechDocventa", fechaInicio)).list();
            }

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return lista;
    }

    @Override
    public List<VentaFacturacion> obtenerGuiasParaFactura(VentaFacturacion ventaFacturacion) throws DAOException {
        //List<VentaFacturacion> lista = new ArrayList<VentaFacturacion>();
        Character[] listaEsdado = {COLOR_ESTADO_VENTA.ANULADO.getEstado()};
        sessionFactory.getCurrentSession().flush();
        Criteria query = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class)
                .addOrder(Order.desc("id"))
                .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                .add(Restrictions.eq("tipoCompago", ventaFacturacion.getTipoCompago()))
                .add(Restrictions.isNull("coddocbase"))
                .add(Restrictions.not(Restrictions.in("estado", listaEsdado)))
                .add(Restrictions.like("ruc", "%" + ventaFacturacion.getRuc() + "%"))
                .add(Restrictions.like("razon", "%" + ventaFacturacion.getRazon() + "%"))
                .add(Restrictions.eq("sede", ventaFacturacion.getSede()));

        if (ventaFacturacion.getMotTraslado() != null) {
            query = query.add(Restrictions.eq("motTraslado", ventaFacturacion.getMotTraslado()));
        }
        //lista = 
        return query.list();
    }

    @Override
    public List<VentaFacturacion> obtenerFacturasExportacionReporte(VentaFacturacion ventaFacturacion) throws DAOException {
        Character[] listaEsdado = {COLOR_ESTADO_VENTA.EMITIDO.getEstado()};
        sessionFactory.getCurrentSession().flush();
        Criteria query = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class)
                .addOrder(Order.desc("fechDocventa"))
                .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                .add(Restrictions.eq("tipoCompago", ventaFacturacion.getTipoCompago()))
                .add(Restrictions.in("estado", listaEsdado))
                .add(Restrictions.le("fechDocventa", UtilitarioFecha.toEndOfYear(UtilitarioFecha.obtenerAnio(ventaFacturacion.getFechDocventa()))))
                .add(Restrictions.ge("fechDocventa", UtilitarioFecha.toStartOfYear(UtilitarioFecha.obtenerAnio(ventaFacturacion.getFechDocventa()))));
        if (ventaFacturacion.getOrdenPedido().getTipoOp() != '0') {
            query = query.createAlias("ordenPedido", "o")
                    .add(Restrictions.eq("o.tipoOp", ventaFacturacion.getOrdenPedido().getTipoOp()));
        }
        //lista = 
        return query.list();
    }

    @Override
    public Collection<VentaFacturacion> obtenerGuiasPorSerie(VentaFacturacion ventaFacturacion, Date fechaInicio, Date fechaFinal,int idEmpresa) throws DAOException {
        Character[] listaEsdado = {COLOR_ESTADO_VENTA.EMITIDO.getEstado(), COLOR_ESTADO_VENTA.ANULADO.getEstado()};
        sessionFactory.getCurrentSession().flush();
        Collection<VentaFacturacion> lista = new ArrayList<VentaFacturacion>();
        Criteria query = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class)
                .createAlias("sede", "se")
                .createAlias("se.idEmpresa", "em")
                .addOrder(Order.desc("numFactura"))
                .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                .add(Restrictions.eq("tipoCompago", ventaFacturacion.getTipoCompago()))
                .add(Restrictions.eq("serieFactura", ventaFacturacion.getSerieFactura()))
                .add(Restrictions.eq("em.id", idEmpresa))
                .add(Restrictions.in("estado", listaEsdado));

        if (fechaInicio == null && fechaFinal == null) {
            lista = query.list();
        } else if (fechaInicio != null && fechaFinal != null) {
            lista = query.add(Restrictions.ge("fechDocventa", fechaInicio)).add(Restrictions.le("fechDocventa", fechaFinal)).list();
        } else if (fechaInicio == null) {
            lista = query.add(Restrictions.le("fechDocventa", fechaFinal)).list();
        } else if (fechaFinal == null) {
            lista = query.add(Restrictions.ge("fechDocventa", fechaInicio)).list();
        }
        //lista = 
        return lista;
    }
    
    @Override
    public Collection<VentaFacturacion> buscarFacturasParaLetras(
    		Integer idCliente, Integer idMoneda, String tipoPago,
    		String estadoCancelacion, Character estadoRegistro)
    		throws DAOException {
    	Criteria cr = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class);	
    	cr.add(Restrictions.eq("codCliente.id",idCliente));
    	cr.add(Restrictions.eq("moneda.id",idMoneda));
    	cr.add(Restrictions.eq("tipoPago",tipoPago));
    	cr.add(Restrictions.eq("estado",estadoCancelacion));
    	cr.add(Restrictions.eq("estadoRegistro",estadoRegistro));
    	cr.add(Restrictions.eq("tipoCompPago",10));
    	return cr.list();
    }
    
    @Override
    public Collection<VentaFacturacion> buscarFacturasParaLetras(
    		Integer idCliente, Integer idMoneda,
    		String estadoCancelacion, Character estadoRegistro)
    		throws DAOException {
    	Criteria cr = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class);
    	if(idCliente!=null && idCliente!=0){
    		cr.add(Restrictions.eq("codCliente.id",idCliente));
    	}
    	
    	if(idMoneda!=null && idMoneda != 0){
    		cr.add(Restrictions.eq("moneda.id",idMoneda));
    	}
    	cr.add(Restrictions.eq("estado",estadoCancelacion));
    	cr.add(Restrictions.eq("estadoRegistro",estadoRegistro));
    	cr.add(Restrictions.eq("tipoCompago",10));
    	return cr.list();
    }
    
    @Override
    public void actualizarFacturasPagadas(
    		List<VentaFacturacion> listaVentaFacturacion) throws DAOException {
    	Session session = sessionFactory.getCurrentSession();
    	for (VentaFacturacion ventaFacturacion : listaVentaFacturacion) {
    		Query query = session.createQuery("UPDATE VentaFacturacion SET estado "+ ventaFacturacion.getEstado() + " WHERE coddocventa = " + ventaFacturacion.getCoddocventa());
        	query.executeUpdate();
		}
    }


    @Override
    public Collection<VentaFacturacion> obtenerVentaFacturacion(
    		Integer idCliente, Integer idMoneda, String estadoCancelacion,
    		Character estadoRegistro,String numFactura) throws DAOException {
    	System.out.println(idCliente + "-" +idMoneda + "-"+ estadoCancelacion + "-" + estadoRegistro+"-");
    	
    	Criteria cr = sessionFactory.getCurrentSession().createCriteria(VentaFacturacion.class);
    	if(idCliente!=null && idCliente!=0){
    		cr.add(Restrictions.eq("codCliente.id",idCliente));
    	}
    	
    	if(idMoneda!=null && idMoneda != 0){
    		cr.add(Restrictions.eq("moneda.id",idMoneda));
    	}
    	
    	if(numFactura!=null && numFactura.length()>0){
    		cr.add(Restrictions.eq("numFactura",numFactura));
    	}
    	cr.add(Restrictions.eq("estado",estadoCancelacion));
    	cr.add(Restrictions.eq("estadoRegistro",estadoRegistro));
    	cr.add(Restrictions.eq("tipoCompago",10));
    	return cr.list();
    }
 
}
